home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / dev / misc / FlexCat_Demos.lha / FlexCat_Demos / Tutorials / Polski / MA-Locale-1.text < prev   
Encoding:
Text File  |  1999-08-18  |  13.3 KB  |  274 lines

  1.  
  2. Ponizszy tekst ukazal sie w formie artykulu na lamach polskiej edycji
  3. Magazynu Amiga.  Postanowilem jednak dolaczyc go w niezmienionej
  4. formie takze jako tutorial do najnowszej edycji FlexCata. Przyklady
  5. do tekstu zalaczone sa w postaci zrodel w jezyku C i znajduja sie
  6. w katalogu "Sources/C".
  7.  
  8. Milej lektury ;-)
  9.  
  10.  
  11. Ponizszy tekst oraz zwiazane z nim przykladowe zrodla nie moga byc
  12. przedrukowywane ani publikowane w zadnej formie, papierowej badz
  13. elektronicznej bez zgody autora tekstu.
  14.  
  15. ©1997-1999 Marcin Orlowski <carlos@amiga.com.pl>
  16.  
  17.  
  18. ---------------------------------------
  19.  
  20.  
  21.                        "Do you arbeit mit printer?"
  22.                           czyli Amiga poliglotkâ
  23.  
  24.  
  25. Mimo, ûe system operacyjny Amigi od dobrych paru lat wspomaga tworzenie
  26. programów wielkojëzykowych (tzw.  zlokalizowanych) to jednak duûy procent
  27. dostëpnych programów z tych dobrodziejstw, nie wiedzieê czemu, nie
  28. korzysta...
  29.  
  30. 1.  Sîowem wstëpu
  31.  
  32. Jak sië w dalszej czëôci przekonasz, decyzja aby napisaê wîasny program
  33. wielojëzykowy, nie pociga za sobâ ûadnych wiëkszych problemów, za to
  34. przynosi dodatkowe korzyôci.  Wbrew pozorom wiëkszoôê Polaków nie zna
  35. jëzyka angielskiego w stopniu wystarczajâcym do bezbolesnej pracy z
  36. programami nim tylko sië posîugujâcymi, podstawowym zaô bîëdem wiëkszoôci
  37. programistów jest zaîoûenie, ûe kaûdy z uûytkowników dysponuje wiedzâ co
  38. najmniej takâ jak oni sami.  W rzeczywistoôci nawet tak proste zwroty jak
  39. "Editing Time", "Saved By", "End of text reached", czy "Talk As You Type"
  40. przysparzajâ wielu problemów (z ciekawszych, niestety autentycznych,
  41. tîumaczeï:  "Edycja czasu", "Zapisz obok", "Wyciâgam zakoïczenia z tekstu"
  42. oraz "Wymowa wedîug parametrów").  Z resztâ szczególne traktowanie jëzyka
  43. angielskiego teû nie jest reguîâ - ilu z was uruchamiajâc nawet ciekawie
  44. zapowiadajâcy sië program, czym prëdzej wybierze "Beenden" widzâê jego
  45. niemiecko-jëzyczny interfejs uûytkownika?
  46.  
  47. 2.  Reguîy...
  48.  
  49. ...sâ doôê proste.  Wybierasz jëzyk, który bëdzie podstawowym dla Twojego
  50. programu (w wiëkszoôci przypadków jest to angielski).  Nastëpnie zabierasz
  51. sie do pisania wîaôciwej treôci programu, z tâ drobnâ róûnicâ, ûe wszystkie
  52. komunikaty programu, które normalnie umieôciîbyô w jego treôci, zastëpujesz
  53. wywoîaniem odpowiedniej funkcji, zaô same teksty umieszczasz w dodatkowym
  54. pliku, z którego bëdziesz je w razie potrzeby podczas pracy pobieraî.
  55.  
  56. 3.  Katalogi
  57.  
  58. Powyûszy mechanizm pozwala na w miarë îatwâ zmianë wersji jëzykowej poprzez
  59. zastâpienie pliku jego tîumaczeniem, i mogîoby sië wydawaê, ûe najlepszym
  60. rozwiâzaniem problemu przechowywania tekstów jest uûycie zwykîego pliku
  61. ASCII.  Niestety, najprostsze rozwiâzania nie zawsze sâ nalepsze.  Na
  62. pierwsze problemy natkniemy sië juû przy modyfikacji zawartoôci takiego
  63. zbioru.  Wystarczy niefrasobliwie usunâê jakikolwiek tekst ze ôrodka, bâdú
  64. zmieniê ich kolejnoôê aby przekonaê sië jak bogatym zasobem przekleïstw
  65. dysponujâ nasi tîumacze.  Przy tym nie mamy ûadnego wpîywu na dîugoôê
  66. poszczególnych tekstów w pliku, gdyû przy prostocie edycji plików ASCII
  67. mogâ sië one w niekontrolowany sposób zmieniaê.  Po trzecie nie mamy ûadnej
  68. kontroli nad aktualnoôciâ wersji takiego pliku.  Po czwarte zaô, wystarczy
  69. uruchomiê program korzystajâcy z pliku o dîugoôci 100KB kilka razy
  70. (pamiëtajmy, ûe od 1995 roku ûyjemy w ôwiecie 32-bitowej wielozadaniowoôci)
  71. aby zauwaûyê drastyczny spadek iloôci dostëpnej wolnej pamiëci. Po piâte
  72. zaô zmuszamy uûytkownika do manipulowania plikami, za kaûdym razem gdy
  73. bëdzie chciaî zmieniê wersjë jëzykowâ.
  74.  
  75. Lekarstwo na wymienione powyûej bolâczki pojawiîo sië po raz pierwszy w
  76. wersji 2.05 systemu operacyjnego i nazywa sië locale.library.  Biblioteka
  77. tak wprowadza wîasny sposób obsîugi tekstów, przechowujâc je w pliku zwanym
  78. katalogiem (od angielskiego "catalog file").  Wykorzystanie tej biblioteki
  79. pozwoli nam na proste zaimplementowanie obsîugi róûnych jëzyków w naszym
  80. programie.
  81.  
  82. Katalog powstaje jako wypadkowa dwóch plików, opisu katalogu (ang.
  83. "catalog descriptor") oraz jego tîumaczenia (ang.  "catalog translation")
  84. "potraktowanych" odpowiednim programem.  Tîumaczenie to jak nazwa wskazuje
  85. inna wersja jëzykowa tekstów programu i w tym artykule nie bëdziemy sië nim
  86. zajmowaê.  Dokîadniej przyjrzymy sië natomiast opisowi katalogu , bowiem
  87. plik ten sîuûy takûe do utworzenia domyôlnej (wbudowanej) wersji jëzykowej,
  88. którâ program nasz bëdzie sië posîugiwaî w przypadku braku jakiegokolwiek
  89. katalogu.  Poniewaû wiëkszoôê z programów sîuûâcych do tworzenia katalogów
  90. ma dodatkowo moûliwoôê generowania odpowiednich tekstów úródîowych do ich
  91. obsîugi, wiëc pracë mamy znacznie uîatwionâ.  Z dostëpnych obecnie narzëdzi
  92. dwa sâ godne uwagi.  Sâ to programy CatComp oraz FlexCat.  CatComp
  93. znajdowaî sië pierwotnie jedynie w pakiecie dostëpnym dla zarejestrowanych
  94. developerów Amigi, co znacznie zawëûaîo krâg jego uûytkowników (obecnie
  95. znaleúê go moûna takûe na pîycie DeveloperCD), natomiast FlexCat jest
  96. programem darmowym i powszechnie dostëpnym w sieci Internet (Aminet katalog
  97. dev/misc, stona WWW:  http://www.wfmh.pl/amiga/).  Wprawdzie oba potrafiâ
  98. generowaê wspomniany juû kod úródîowy, lecz jedynie FlexCat dziëki
  99. wykorzystaniu tekstów wzorcowych (patrz dokumentacja programu), obsîuguje
  100. jëzyki inne niû C (obecnie sâ to Assembler, AmigaE, C++, Modula oraz
  101. Oberon, zaô w razie potrzeby moûna samemu dodaê obsîugë kaûdego nowego
  102. jëzyka).
  103.  
  104. 4. Skîadnia
  105.  
  106. Kaûdy tekst w pliku opisowym poprzedzony jest odpowiedniâ deklaracjâ w
  107. formacie:
  108.  
  109. ETYKIETA (ID/MIN/MAX)
  110.  
  111. gdzie ETYKIETA to unikalny ciâg znaków identyfikujâcy dany tekst, np.
  112. MSG_TEXT_2.  ID to, równieû unikalny, identyfikator tekstu, zaô MIN i MAX
  113. to dopuszczalna minimalna i maksymalna dîugoôê tîumaczenia danego tekstu.
  114. ID, MIN oraz MAX sâ wartoôciami opcjonalnymi i mogâ zostaê pominiëte.  W
  115. przypadku nie podania jawnie wartoôci ID, zostanie ona wygenerowana
  116. automatycznie, zaô niepodanie MIN czy MAX oznacza brak narzuconych
  117. ograniczeï (patrz listing #1).  Najprostsza forma deklaracji zatem to:
  118.  
  119. ETYKIETA (//)
  120.  
  121. Bezpoôrednio pod etykietâ umieszczamy wîaôciwy tekst.  Jeôli zajmowaê ma on
  122. wiëcej niû jednâ linië, kaûdâ z nich koïczymy znakiem "\" (podobnie jak w
  123. przypadku #define w jëzyku C).  W przypadku wykorzystania z sekwencji
  124. specjalnych jak np.  %s, %ld czy '\n', '\t' zarówno FlexCat jak i CatComp
  125. sprawdzâ ich poprawnoôê oraz ostrzegâ w przypadku uûycia niestandardowych
  126. sekwencji.  Dopuszczalne sâ takûe linie komentarza, które rozpoczyna znak
  127. ôrednika umieszczony w pierwszej kolumnie.
  128.  
  129. 5.  Funkcje biblioteczne
  130.  
  131. Uûywanie katalogów nie odbiega wcale do pracy z bibliotekami systemowymi.
  132. przed ich uûyciem naleûy katalog otworzyê (otwierajâc uprzednio bibliotekë
  133. locale.library):
  134.  
  135. struct Catalog *OpenCatalog(Locale, Nazwa, Tag, ...);
  136.  
  137. gdzie Locale to wskaúnik na strukturë Locale, dla których chcemy dany
  138. katalog otworzyê.  Zazwyczaj podaje sië wartoôê NULL, co powoduje uûycie
  139. struktury aktualnie uûywanej przez system (a ustawionej przez uûytkownika
  140. za pomocâ panelu preferencji Locale).  Nazwa okreôla fizycznâ nazwë
  141. uûywanego przez program katalogu.  Naleûy podaê jedynie nazwë pliku (np.
  142. "HelloWorld.catalog"), do której dodana zostanie ôcieûka np.
  143. "PROGDIR:Catalogs/" + "polski/" (nazwa kolejnego, ustawionego przez
  144. uûytkownika systemu, preferowanego jëzyka pobrana ze struktury Locale).
  145. Dodatkowe tagi umoûliwiajâ wymuszenie otwarcia katalogu o konkretnej wersji
  146. (OC_Version - w odróûnieniu od OpenLibrary(), numer wersji katalogu musi
  147. byê identyczny z ûâdanym, aby wykonanie funkcji sië powiodîo), czy
  148. okreôlenie jëzyka (OC_BuiltInLanguage) jaki jest w program wbudowany (w
  149. naszym przykîadzie jëzyk wbudowany okreôlimy uûywajâc atrybutu #language,
  150. króry jest rozszerzeniem skîadni wprowadzonym przez FlexCata).  Podanie
  151. NULL oznacza iû program nie posiada wbudowanych tekstów, jednakûe sytuacja
  152. taka nie jest wskazana, choê moûe byê przydatne w przypadku programów
  153. majâcych bardzo duûâ bazë komunikatów.  Po skoïczonej pracy katalog naleûy
  154. zamknâê:
  155.  
  156. void CloseCatalog(struct Catalog *catalog);
  157.  
  158. W odróûnieniu od wiëkszoôci innych funkcji systemowych, NULL jako wynik
  159. OpenCatalog() nie oznacza bîëdu, a jedynie fakt nieznalezienia pliku z
  160. ûâdanâ wersjâ jëzykowâ.  NULL jest takûe poprawnym argumentem funkcji
  161. CloseCatalog().
  162.  
  163. Poszczególne teksty pobieraê bëdziemy za pomocâ funkcji:
  164.  
  165. STRPTR GetCatalogStr(struct Catalog *catalog, LONG Numer, STRPTR TekstDomyôlny);
  166.  
  167. gdzie Numer to ID ûâdanego tekstu, zaô TekstDomyôlny to wskaúnik na tekst
  168. który uûyty bëdzie gdy ciâg znakow o ûâdanym ID nie zostaî w katalogu
  169. znaleziony bâdú wskaúnik catalog równy jest NULL (np.  z powodu braku
  170. katalogu).  Jako rezultat otrzymamy wskaúnik na interesujâcy nas tekst.
  171. Pozostaje on waûny do momentu zamkniëcia katalogu i pamiëtaê naleûy, ûe tak
  172. jak biblioteki czy czcionki, katalog wczytywany jest do pamiëci tylko raz,
  173. podczas pierwszego otwarcia, zatem ûe tekst na który wskaúnik otrzymaliômy
  174. jest tylko do odczytu.
  175.  
  176. 6.  Program przykîadowy
  177.  
  178. Do utworzenia niezbëdnych procedur obsîugi katalogów oraz wersji domyôlnej
  179. posîuûymy sië w naszym przykîadzie FlexCatem.  Po zapisaniu na dysku opisu
  180. katalogu (listing #1) oraz úródîa wîaôciwego (listing #2), uruchamiamy
  181. FlexCata:
  182.  
  183. FlexCat HelloWorld.cd HelloWorld_str.c=AutoC_c.sd
  184. FlexCat HelloWorld.cd HelloWorld_str.h=AutoC_h.sd
  185.  
  186. Dodatkowy tekst úródîowy utworzony na podstawie wzorca AutoC wykorzystuje
  187. bardzo wygodny mechanizm autoinicjalizacji/autoterminacji, który w tym
  188. przypadku zwalnia nas od rëcznego wywoîywania funkcji
  189. otwierajâcych/zamykajâcych biblioteki oraz plik katalogu.  Jeôli uûywasz
  190. kompilatora innego niû SAS/C, Dice badú gcc musisz dopisaê wywoîania
  191. funkcji _STIOpenCatalog() i _STICloseCatalog(), bâdú uûyê innego wzorca.
  192. Dolâczamy do naszego úródîa wygenerowany plik HelloWorld_str.h aby móc sië
  193. do tekstów odwoîywaê za pomocâ etykiet, a nastëpnie caîoôê kompilujemy:
  194.  
  195. SC HelloWorld.c HelloWorld_str.c LINK PROGNAME=HelloWorld
  196.  
  197. i uruchamiamy.  Przykro mi jeôli spodziewaîeô sie w tym miejscu
  198. fajerwerków.  Dopóki nie utworzymy dodatkowych katalogów do programu, to
  199. wizualnie nie bëdzie sië róûniî od swoich "normalnych" braci.  Ale to
  200. dopiero za miesiâc.
  201.  
  202. 7.  Drobiazgi uîatwiajâce ûycie
  203.  
  204. Wszystkim którzy tîumaczyê bëdâ Twój program z pewnoôciâ pomoûesz, jeôli
  205. uwzglëdnisz poniûszych parë "drobiazgów" (a z wîasnego doôwiadczenia wiem
  206. jak irytujâcy moûe byê fakt ich braku):
  207.  
  208. * Etykietë  kaûdego  tekstu  rozpoczynaj  od  przedrostka  MSG_.  Znacznie
  209.   uîatwia to póúniejszâ aktualizacjë istniejâcych katalogów, gdyû w oparciu
  210.   o przedrostek moûna szybko stworzyê prostâ makrodefinicjë (np.  uûywajâc
  211.   CEDa), która skopiuje istniejâce tîumaczenia z poprzedniej edycji.
  212.   Oczywiôcie moûesz uûyê innego przedrostka (byle w identycznego dla wszystkich
  213.   etykiet), jednak utarîo sië aby byî to ciâg "MSG_".
  214.  
  215. * Unikaj  enigmatycznych identyfikatorów.  Wprawdzie doskonale wiesz kiedy
  216.   kaûdy z tekstów jest uûywany, ale wiekszoôê tîumaczy zdolnoôci
  217.   jasnowidzenia nie posiada i raczej na pewno nie zgadnie gdzie dany tekst
  218.   wykorzystujesz.  Tîumaczenie moûe wtedy byê zrobione na tzw.  "oko" i
  219.   nie koniecznie musi wtedy pasowaê do kontekstu caîoôci.  Po prostu pisz
  220.   MSG_MAIN_WINDOW_TITLE zamiast MSG_13254 (palce na pewno Cië nie
  221.   rozbolâ).
  222.  
  223. * Nie uûywaj etykiet w jëzyku polskim (lub jak kto woli pisz po angielsku).
  224.   W poîâczeniu z poprzednim "drobiazgiem" pozwoli to tîumaczowi zorientowaê
  225.   sië w kontekscie uûycia danego tekstu i odpowiednio to przetîumaczyê, w
  226.   przeciwnym razie uraczysz go odpowiednikiem MSG_BEHAGA_NEDTRYCKA_ENTER
  227.  
  228. * Nie bâdú skâpy.  Pamiëtaj ûe w zaleûnoôci od kontekstu tîumacz moûe
  229.   chcieê zastosowaê rózne tîumaczenia tego samego wyrazu czy choêby go
  230.   odmieniê (aby uniknâê îamaïców typu "OKNO/NOWY").  Pozwól mu wiëc na to i
  231.   nie wykorzystuj jednego tekstu do wielu zastosowaï.
  232.  
  233. * Rzadko kiedy tîumacz ma tyle wolnego czasu (albo ochoty) aby przeîoûyê
  234.   wszystkie teksty za jednym posiedzeniem.  Czësto teû chciaîby popracowaê
  235.   chwilë z niedokoïczonym tîumaczeniem (co pozwala wykryê niedokîadnoôci
  236.   czy choêby literówki).  I tu napotyka na pewien problem.  Poniewaû
  237.   przekîad nie jest skoïczony, pewien procent pól w pliku #?.ct jest pustych.
  238.   Katalog wygenerowany na jego podstawie bëdzie wiëc zawieraî jedynie
  239.   identyfikatory danych tekstów. Pobranie takiego tekstu da nam w rezultacie
  240.   wskaúnik na ciâg znaków o dîugoôci zero i jeôli go uûyjemy zaowocuje to
  241.   nam pustymi gadûetami czy polami menu. Aby temu zaradziê zmodyfikujemy
  242.   nieznacznie wzorzec funkcji GetString() zawarty w pliku AutoC_c.sd
  243.   FlexCata, tak aby w przypadku napotkania pustego ciâgu zwracaî nam tekst
  244.   wbudowany. Zmodyfikowana funkcja wyglâdaê moûe np. tak:
  245.  
  246.   STRPTR GetString(struct FC_Type *fcstr)
  247.   {
  248.   STRPTR defaultstr = fcstr->Str;
  249.   LONG   strnum     = fcstr->ID;
  250.   STRPTR str;
  251.  
  252.     str = (%b_Catalog ? GetCatalogStr(%b_Catalog, strnum, defaultstr) :
  253.             defaultstr);
  254.     
  255.     return((strlen(str) > 0) ? str, defaultstr);
  256.   }
  257.  
  258.   Najoptymalniej byîoby aby takie zachowanie byîo opcjonalne i domyôlnie
  259.   wyîâczone. Jednakûe brak takiej moûliwoôci jest znacznie mniej dotkliwy
  260.   niû puste gadûety.
  261.  
  262. * Funkcja OpenCatalog() szuka katalogu który chcesz otworzyê najpierw w
  263.   "PROGDIR:Catalogs/" a dopiero potem w "LOCALE:Catalogs/", zatem jeôli
  264.   nie masz naprawdë powaûnych powodów ku temu, nie instaluj katalogów
  265.   od swojego programu w tym ostatnim.
  266.  
  267.  
  268. 8.  W nastëpnym odcinku...
  269.  
  270. Za miesiâc ostatnia czëôê z naszego mini cykly, w której, dla odmiany
  271. przyjrzymy sië sië programom od oczyma tîumacza oraz nauczymy nasz
  272. przykîadowy programik jëzyków obcych (czyli pokaûemy po co naprawdë to
  273. wszystko nam byîo potrzebne).
  274.